package com.gdsdxy.service.impl;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gdsdxy.dto.ResultVo;
import com.gdsdxy.entity.BlogClassification;
import com.gdsdxy.mapper.BlogClassificationMapper;
import com.gdsdxy.service.IBlogClassificationService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
public class BlogClassificationServiceImpl extends ServiceImpl<BlogClassificationMapper, BlogClassification> implements IBlogClassificationService {
    @Resource
    private BlogClassificationMapper blogClassificationMapper;

    //根据id查询分类
    @Override
    public ResultVo findBlogClassify(Long id) {
        BlogClassification byId = getById(id);
        return ResultVo.ok(byId);
    }

    //根据Fid查询二级分类
    @Override
    public ResultVo findBlogClassifyByFid(Long fid) {
        List<BlogClassification> classificationList = query().eq("fid", fid).list();
        return ResultVo.ok(classificationList);
    }

    //查询多条分类-分页操作
    @Override
    public ResultVo findListBlogClassify(Integer page, Integer strip) {
        Page<BlogClassification> classificationPage = new Page<>(page, strip);
        blogClassificationMapper.selectPage(classificationPage,  null);
        return ResultVo.ok(classificationPage);
    }

    //添加分类
    @Override
    public ResultVo addBlogClassify(BlogClassification blogClassification) {
        boolean save = save(blogClassification);
        return save ? ResultVo.ok("添加成功") : ResultVo.fail("添加失败");
    }

    //修改分类
    @Override
    public ResultVo updateBlogClassify(BlogClassification blogClassification) {
        Long id = blogClassification.getId();
        BlogClassification classification = getById(id);
        if (classification == null){
            return ResultVo.fail("该分类不存在！");
        }
        UpdateWrapper<BlogClassification> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", blogClassification.getId());
        boolean update = update(blogClassification, updateWrapper);
        return update ? ResultVo.ok("修改成功"):ResultVo.fail("修改失败");
    }

    //删除分类
    @Override
    public ResultVo deleteBlogClassify(Long id) {
        // 查询祖先分类【一级 二级等多级分类】
        BlogClassification classification = getById(id);

        //判断分类是否存在
        if (classification == null) {
            return ResultVo.fail("分类不存在");
        }

        //判断分类是否已含有商品分类信息
        //Integer goodsCount = goodsService.query().eq("cid",id).count();
        //if (goodsCount > 0){
        //      return ResultVo.fail("该分类已含有商品分类信息，暂无法删除！");
        //}

        // 查询子分类 一层 父id
        boolean result = del(id);
        //删除分类
        return result ? ResultVo.ok("删除成功") : ResultVo.fail("删除失败");
    }

    private boolean del(Long id) {

        /**
         * 拿到一级 id
         * 根据一级id 遍历查询二级分类
         * 判断二级分类是否有子分类
         * 根据二级id 遍历查询三级分类 以此类推
         */
        // 查询该分类是否存在子分类
        List<BlogClassification> tow = query().eq("fid", id).list();
        // 该分类不存在子分类
        if (!tow.isEmpty()) {
            // 如果存在子分类，遍历该分类的每一个子分类
            for (BlogClassification blogClassification : tow) {
                // 获取每个分类的id
                Long cid = blogClassification.getId();
                // 执行删除操作
                boolean result = del(cid);
                //若遇到删除失败，直接返回 false
                if (!result) {
                    return false;
                }
            }
        }
        // 不存在子分类，删除分类
        return removeById(id);
    }
}
